'use strict'

const {PostgreModel, dataTypes} = require('psqlorm')

/**
 * @typedef {object} column
 * @property {string} type - 类型
 * @property {string} refActionDelete - 外键删除后的行为，可以设置为cascade，具体参考数据库文档。
 * @property {string} refActionUpdate - 外键更新后的行为，可以设置为cascade，具体参考数据库文档。
 * @property {string} ref - 外键引用，格式 ModelName:COLUMN，示例：'users:id'
 * @property {string|number} default - 默认值。
 * @property {boolean} notNull - 不允许为null，默认为true。
 * @property {string} oldName - 原column名称，如果要重命名字段，需要oldName指定原有名字。
 * @property {boolean} typeLock - 是否锁定类型，如果为true则会锁定类型，不会更新。
 *
 * 如果指定ref，type会保持和外键引用的字段一致。
 */

//在column中编辑列属性。
/**
 * dataTypes对常用的类型提供了一个中间层：
 *  它的主要目的不是为了提供方便，
 *  而是提供一个统一的格式并尽可能防止出错。
 *  尽可能避免大小写不一致、前后有空格等问题。
 *  STRING() CHAR() NUMBER() ARRAY() 是函数类型，其他如TEXT、INT、BIGINT等是普通属性值。
 */


let table = {
  column: {
    /**
     * @type {column}
     * id默认是主键，不需要再加入到unique索引。
     * */
    id: {
      type : dataTypes.ID
    },

    openid: {
      type: dataTypes.OPENID
    },

    nickname: {
      type: dataTypes.STRING(100),
      default: '[NULL]'
    },

    level: {
      type: dataTypes.INT,
      default: 1
    },

    //可以是JSON数据，使用程序进行JSON.stringify 和JSON.parse
    detail: {
      type: dataTypes.TEXT,
      default: ''
    },

    /**
     * @type {column}
     * */
    create_time: {
      type : dataTypes.BIGINT,
      default: 0,
      //执行insert时自动生成时间戳
      timestamp: 'insert'
    },
    
    /**
     * @type {column}
     * */
    update_time: {
      type : dataTypes.BIGINT,
      default: 0,
      //执行update时自动生成时间戳
      timestamp: 'update'
    },

    point: {
      type: dataTypes.INT,
      default: 0
    }
  },

  //索引
  index: [
    'create_time',
    'update_time'
  ],

  //唯一索引
  unique: [
    'openid'
  ]
}

class Users extends PostgreModel {

  constructor (pqorm) {
    //必须存在并且写在最前面。
    super(pqorm)

    //主要用于引用外键时，用于获取当前模块的路径，也可以在外键引用ref属性上指定路径。
    this.modelPath = __dirname

    //主键id前缀，建议不要超过2字符，请确保前缀和idLen的长度 <= 数据库字段的最大长度。
    this.idPre = ''

    //id的长度，默认为16，为保证有序增长，建议id长度不要低于16。
    //this.idLen = 16

    //默认主键名为id，并且是字符串类型，主键id会自动生成。
    //this.primaryKey = 'id'

    //数据表真正的名称，注意：postgresql不支持表名大写，更改名称请使用小写字母。
    this.tableName = 'mpusers'

    this.table = table

    this.columns = Object.keys(this.table.column)

    //以下是示例代码，初始化需要的模型
    // this.users = new require('./users.js')(this.pqorm)
    // 如果不传递参数，则会使用默认的值，将会查找原型上是否存在__pqorm__属性。
    // this.admin = new require('./admin.js')()
  }

  //创建小程序用户
  async createMpUser(data) {
    if (!data.openid) {
      throw new Error('缺少openid，无法创建用户')
    }
    
    let u = await this.where('openid', data.openid).get()
    
    if (u) return u

    return this.returning(['id', 'openid', 'create_time']).insert(data)
  }
  
}

module.exports = Users
